package com.dyna.core.utils;

import com.github.luben.zstd.Zstd;

/**
 * Zstandard (Zstd) 压缩工具类
 * 提供高效的二进制数据压缩/解压方法，适用于对性能和压缩率有要求的场景
 * 依赖：com.github.luben:zstd-jni
 */
public class ZstdCompressionUtil {

    /**
     * 压缩二进制数据
     * @param data 原始数据字节数组（不允许为null）
     * @return 压缩后的字节数组
     * @throws IllegalArgumentException 如果输入数据为null
     * @apiNote 压缩级别使用Zstd默认级别(3)
     * @example
     * byte[] rawData = "example".getBytes();
     * byte[] compressed = ZstdCompressionUtil.compress(rawData);
     */
    public static byte[] compress(byte[] data) {
        if (data == null) {
            throw new IllegalArgumentException("Input data cannot be null");
        }
        return Zstd.compress(data);
    }

    /**
     * 解压二进制数据
     * @param compressed 压缩后的字节数组（不允许为null）
     * @param originalLength 原始数据的长度（必须准确）
     * @return 解压后的原始数据字节数组
     * @throws IllegalArgumentException 如果参数不合法
     * @throws RuntimeException 如果解压失败（数据损坏或长度不匹配）
     * @warning 必须确保originalLength准确，否则会导致解压失败或数据损坏
     * @example
     * byte[] restored = ZstdCompressionUtil.decompress(compressed,  rawData.length);
     */
    public static byte[] decompress(byte[] compressed, int originalLength) {
        // 参数校验
        if (compressed == null) {
            throw new IllegalArgumentException("Compressed data cannot be null");
        }
        if (originalLength <= 0) {
            throw new IllegalArgumentException("Original length must be positive");
        }

        byte[] restored = new byte[originalLength];
        long decompressedSize = Zstd.decompress(restored,  compressed);

        // 验证解压后的数据长度是否匹配
        if (decompressedSize != originalLength) {
            throw new RuntimeException(String.format(
                    "Decompression size mismatch: expected %d but got %d",
                    originalLength, decompressedSize));
        }

        return restored;
    }

}